'''
已审核页面根据收款状态进行区分要代收款,文件保存名为客户名称(公司名)后按数字递增命名,如果是带P的单号则不需要单号

单个申报号对应的链接 : sales!view.action?id=3LWPu3JHlHmFila23_Whjg..&dcto=Z2&iskp=
最终页面 : https://s.naton.cn/naton/admin/sales!view.action?id=rYb0Iq5oHZcTX3jzieSwbA..&dcto=Z2&iskp=

登录链接 : https://s.naton.cn/naton/admin/page!login.action  POST 
From_Data : 
j_username:  
j_password: 
j_captcha: aqtq      这个就是验证码
need: 0

正确请求login.action后,会返回一个主页面的链接 : https://s.naton.cn/naton/admin/page!main.action   GET
请求之后就是官方网站了

使用selenium的webdriver获取验证码,需要用到chrome的驱动放到python.exe同一目录下,
然后用户通过input保存起来的验证码实现自动化登录,selenium自带简单的html元素获取方法
'''
from datetime import datetime,timedelta
from selenium import webdriver
import requests
from bs4 import BeautifulSoup
import pandas as pd
from copy import deepcopy

# 用户自己输入路径
mainPath:str='D:/artical'   # 自己修改
picPath:str=mainPath+'/验证码.jpeg'
# 输出结果保存的目录
savePath:str=mainPath+'/'

mainURL:str='https://s.naton.cn/naton/admin/page!main.action'
salesURL:str='https://s.naton.cn/naton/admin/sales!list.action'
fSingleURL:str='https://s.naton.cn/naton/admin/'

# --------------------------- 模拟登录 -------------------------
browser=webdriver.Chrome()    # 实例化一个浏览器对象
browser.get(mainURL)
png = browser.find_element_by_id('captchaImage')  # 查找验证码元素
png.screenshot(picPath)  # 对验证码进行截图并保存
captchaCode:str=input("输入验证码 : ")
print("你输入的验证码为 : ",captchaCode)
browser.find_element_by_id('username').send_keys('****')  # 找到账号框并输入账号
browser.find_element_by_id('password').send_keys('******')  # 找到密码框并输入密码
browser.find_element_by_id('captcha').send_keys(captchaCode)  # 找到验证码框并输入验证码
browser.find_element_by_id('loginButton').click()  # 找到登陆按钮并点击
cookies = browser.get_cookies()       # 获取浏览器cookies

# -------------------- 登录状态转到requests -----------------------
s = requests.session()  # 新建session
c = requests.cookies.RequestsCookieJar()
for i in cookies:
    c.set(i["name"], i['value'])
s.cookies.update(c)  # 更新session里cookies

# ------------------------ 开始爬取数据 ---------------------------
nowDate:str=datetime.now().strftime("%Y-%m-%d")
lastDate:str=(datetime.now()+timedelta(weeks=-1*4)).strftime('%Y-%m-%d')
payload:dict={'page.pageSize':'100','page.pageNumber':'1','billStaDate':nowDate,'billEndDate':lastDate}
salePage=s.post(salesURL,data=payload,headers={"content-type":"application/x-www-form-urlencoded"})
soup = BeautifulSoup(salePage.content, "html.parser")
rightHref:list=[]
for tr in soup.find_all(name='tr'):
    tampList:list=tr.find_all(name='a')
    if len(tampList)>3 or len(tampList)==0:
        continue
    
    # 判断条件
    po:bool=False      # 带有PO号的才是要爬的   条件一
    money:bool=False   # 是"待收款"才是需要爬的 条件二
    
    for i in tr.find_all(name='td'):
        text:str=i.get_text()
        if 'PO' in text:
            po=True
        if '待收款' in text:
            money=True
        if po and money:
            # https://s.naton.cn/naton/admin/sales!view.action?id=WLD8HsUs7RiXoGMyUqLOpQ..&dcto=Z2&iskp=
            href:str=fSingleURL+'/'+tampList[0].attrs['href']
            rightHref.append(href)
    
    # 初始化判断条件
    po=False
    money=False
print('共有页面个数 : ',len(rightHref))


# ------------------------- 获取页面的内容 ----------------------------
fileCounter:int=1
for pageLink in rightHref:
    resultList:list=[]
    result:dict={'code':'','name':'','volume':'','price':'','money':''}
    
    html_str:str=s.get(pageLink).content
    soup = BeautifulSoup(html_str, 'html5lib')
    table=soup.select('#chanpinList')
    tdList:list=soup.find_all('tr')[7:]
    for td in tdList:
        tampTd:list=td.text.split('<td')
        tampRe:list=tampTd[0].split('\n\t\t\t\t\t\t\t')
        result['code']=tampRe[2]
        result['name']=tampRe[3]
        result['volume']=tampRe[5]
        result['price']=tampRe[11]
        if '\n\t\t\t\t\t\t' in tampRe[12]:
            result['money']=tampRe[12].replace('\n\t\t\t\t\t\t','')
        else:
            print('金额这数据出现不知道的情况 : {}'.format(tampRe[12]))
        resultList.append(deepcopy(result))
        result:dict={'code':'','name':'','volume':'','price':'','money':''}
    
    resultDF=pd.DataFrame(resultList)
    resultDF.to_csv(savePath+str(fileCounter)+'.csv',index=False,encoding='gbk')
    if not len(resultList):
        print('爬取页面出现问题,这个网页没法获取到数据,自己打开检查一下情况 : {}'.format(pageLink))
    else:
        print('成功下载页面内容')
    fileCounter+=1


print('程序运行结束')